home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / tools / developer-tools / c-tools / vbcc / machines / amiga68k / vbrowse / vbrowse.c < prev   
Encoding:
C/C++ Source or Header  |  1996-06-17  |  9.6 KB  |  258 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <graphics/gfxbase.h>
  4. #include <intuition/intuition.h>
  5. #include <libraries/gadtools.h>
  6. #include <clib/exec_protos.h>
  7. #include <clib/intuition_protos.h>
  8. #include <clib/gadtools_protos.h>
  9. #include <clib/alib_protos.h>
  10. #include <exec/nodes.h>
  11. #include <exec/lists.h>
  12.  
  13. #include "vbrowse.h"
  14.  
  15. struct Library *GadToolsBase;
  16. struct IntuitionBase *IntuitionBase;
  17. struct GfxBase *GfxBase;
  18. struct Screen *Screen;
  19.  
  20. struct List list;
  21.  
  22. struct MsgPort *myport;
  23.  
  24. #define BREITE 600
  25. #define HOEHE  100
  26. #define LINKS  10
  27. #define OBEN   10
  28.  
  29. struct NewWindow nw={LINKS,OBEN,BREITE,HOEHE,     /* left,top,width,height    */
  30.                      0,1,               /* pens                     */
  31.                      IDCMP_NEWSIZE|IDCMP_REFRESHWINDOW|LISTVIEWIDCMP|
  32.                      GADGETUP|GADGETDOWN|CLOSEWINDOW,   /*  IDCMP   */
  33.                      /* flags   */
  34.                      WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|
  35.                      WFLG_CLOSEGADGET|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE,
  36.                      0,0,               /* FirstGadget,CheckMark    */
  37.                      (UBYTE*)"vbrowse", /* title                    */
  38.                      0,0,               /* screen,SuperBitmap       */
  39.                      70,70,32767,32767,     /* MinWidth, etc.           */
  40.                      WBENCHSCREEN       /* type                     */
  41. };
  42.  
  43. struct NewGadget listview={70,30,300,320,      /* left,top,width,height    */
  44.                      0,
  45.                      0,                 /* font                     */
  46.                      2,                 /* GadgetID                 */
  47.                      0,0,0              /* flags,VInfo,UserData     */
  48. };
  49.  
  50. struct EasyStruct easy={sizeof(struct EasyStruct),0,"vbrowse",0,"OK"};
  51.  
  52.  
  53. struct Window *Window;
  54. struct Gadget *Gadget,*GadgetList;
  55. struct VisualInfo *VisualInfo;
  56.  
  57. struct TextAttr ta;
  58.  
  59. struct IntuiMessage *IMsg;
  60. struct Message *msg;
  61.  
  62. int fhoehe,scrollwidth,count;
  63.  
  64. char *call_editor="ged line %d %s",*call_error="showerr %d";
  65.  
  66. void closethings(void)
  67. {
  68.     if(myport) DeletePort(myport);
  69.     if(Screen) UnlockPubScreen(0,Screen);
  70.     if(Window) CloseWindow(Window);
  71.     if(GadgetList) FreeGadgets(GadgetList);
  72.     if(VisualInfo) FreeVisualInfo(VisualInfo);
  73.     if(GadToolsBase) CloseLibrary(GadToolsBase);
  74.     if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  75.     if(GfxBase) CloseLibrary((struct Library *)GfxBase);
  76.     exit(0);
  77. }
  78.  
  79. void error(char *text)
  80. {
  81.     easy.es_TextFormat=text;
  82.     EasyRequest(0,&easy,0);
  83. }
  84. void openthings(void)
  85. {
  86.     struct TextFont *defaultf;
  87.  
  88.     if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary((UBYTE*)"intuition.library",36)))
  89.         closethings();
  90.     if(!(GadToolsBase=OpenLibrary((UBYTE*)"gadtools.library",39)))
  91.         closethings();
  92.     if(!(GfxBase=(struct GfxBase *)OpenLibrary((UBYTE*)"graphics.library",0)))
  93.         closethings();
  94.     Forbid();
  95.     if(FindPort(PORTNAME)){Permit();error("vbrowse already running");exit(EXIT_SUCCESS);}
  96.     Permit();
  97.     if(!(myport=CreatePort(PORTNAME,0)))
  98.         {error("Could get no port");closethings();}
  99.     defaultf=GfxBase->DefaultFont;
  100.     ta.ta_Name=defaultf->tf_Message.mn_Node.ln_Name;
  101.     ta.ta_YSize=defaultf->tf_YSize;
  102.     ta.ta_Style=defaultf->tf_Style;
  103.     ta.ta_Flags=defaultf->tf_Flags;
  104.     if(!(Screen=LockPubScreen(0)))  /*  Workbench   */
  105.         {error("Could not lock screen");closethings();}
  106.     fhoehe=Screen->Font->ta_YSize;
  107.     scrollwidth=fhoehe>12?fhoehe+4:16;
  108.     listview.ng_LeftEdge=10;
  109.     listview.ng_TopEdge=10+fhoehe;
  110.     listview.ng_Width=nw.Width-36;
  111.     listview.ng_Height=nw.Height-20-fhoehe;
  112.     NewList(&list);
  113.  
  114.     if(!(VisualInfo=GetVisualInfo(Screen,TAG_END)))
  115.         {error("No visual info");closethings();}
  116.     if(!(Gadget=CreateContext(&GadgetList)))
  117.         {error("No context");closethings();}
  118.     /*  hier werden die Gadgets initialisiert   */
  119.     listview.ng_VisualInfo=VisualInfo;    /*  VisualInfo und Font eintragen   */
  120.     listview.ng_TextAttr=&ta;
  121.     Gadget=CreateGadget(LISTVIEW_KIND,Gadget,&listview,GTLV_Labels,&list,
  122.                         GTLV_ScrollWidth,scrollwidth,GTLV_ShowSelected,0,TAG_END);
  123.     if(!Gadget) {error("No gadget");closethings();}
  124.  
  125.     nw.FirstGadget=GadgetList;
  126.     if(!(Window=OpenWindow(&nw)))
  127.         {error("No window");closethings();}
  128.     GT_RefreshWindow(Window,0);
  129. }
  130.  
  131. int main(int argc,char **argv)
  132. {
  133.     long lastn=0,currentn;int i;char *mem;
  134.     ULONG lasts=0,lastm=0,currents=0,currentm=0;
  135.     for(i=1;i<argc;i++){
  136.         if(!strcmp(argv[i],"editor")&&i<argc) call_editor=argv[++i];
  137.         if(!strcmp(argv[i],"error")&&i<argc) call_error=argv[++i];
  138.         if(!strcmp(argv[i],"width")&&i<argc) nw.Width=atoi(argv[++i]);
  139.         if(!strcmp(argv[i],"height")&&i<argc) nw.Height=atoi(argv[++i]);
  140.         if(!strcmp(argv[i],"left")&&i<argc) nw.LeftEdge=atoi(argv[++i]);
  141.         if(!strcmp(argv[i],"top")&&i<argc) nw.TopEdge=atoi(argv[++i]);
  142.     }
  143.     openthings();
  144.     while(1){
  145.         Wait((1<<Window->UserPort->mp_SigBit)|(1<<myport->mp_SigBit));
  146.  
  147.         while(IMsg=GT_GetIMsg(Window->UserPort)){
  148.             switch(IMsg->Class){
  149.             case IDCMP_CLOSEWINDOW:
  150.                 GT_ReplyIMsg(IMsg);
  151.                 closethings();
  152.  
  153.             case IDCMP_REFRESHWINDOW:
  154.  
  155.                 GT_BeginRefresh(Window);
  156.                 GT_EndRefresh(Window,TRUE);
  157.                 break;
  158.  
  159.             case IDCMP_GADGETUP:
  160.                 CurrentTime(¤ts,¤tm);
  161.                 GT_GetGadgetAttrs(Gadget,Window,0,GTLV_Selected,¤tn,TAG_END);
  162.                 if(currentn==lastn&&DoubleClick(lasts,lastm,currents,currentm)){
  163.                     struct Node *p;int errorn,line;char file[256];
  164.                     *file='\"';
  165.                     p=list.lh_Head;
  166.                     lastn=currentn;
  167.                     while(lastn){p=p->ln_Succ;lastn--;}
  168.                     if(sscanf(p->ln_Name,"error %d in line %d of \" %[^\"]",&errorn,&line,file+1)==3||
  169.                        sscanf(p->ln_Name,"warning %d in line %d of \" %[^\"]",&errorn,&line,file+1)==3){
  170.  
  171. /*                        printf("vbr:errorn=%d\n",errorn);*/
  172.                         mem=malloc(strlen(call_error)+100);
  173.                         sprintf(mem,call_error,errorn);
  174.                         system(mem);
  175.                         free(mem);
  176.                     }else{
  177.                         if(*p->ln_Name=='>'&&p->ln_Succ){
  178.                             p=p->ln_Succ;
  179.                             if(sscanf(p->ln_Name,"error %d in line %d of \" %[^\"]",&errorn,&line,file+1)==3||
  180.                                sscanf(p->ln_Name,"warning %d in line %d of \" %[^\"]",&errorn,&line,file+1)==3){
  181.  
  182.                                 strcat(file,"\"");
  183. /*                                printf("vbr:file=%s, line=%d\n",file,line);*/
  184.                                 mem=malloc(strlen(call_error)+strlen(file)+100);
  185.                                 sprintf(mem,call_editor,line,file);
  186.                                 system(mem);
  187.                                 free(mem);
  188.                             }
  189.                         }else error("You have to click on an error/warning message");
  190.                     }
  191.                 }
  192.                 lastn=currentn;lasts=currents;lastm=currentm;
  193.                 break;
  194.  
  195.             case IDCMP_GADGETDOWN:
  196. /*                printf("GadgetDown (%d)\n",((struct Gadget *)IMsg->IAddress)->GadgetID);*/
  197.                 break;
  198.  
  199.             case IDCMP_NEWSIZE:
  200.                 {
  201.                 int top,selected;
  202.                 GT_GetGadgetAttrs(Gadget,Window,0,GTLV_Top,&top,GTLV_Selected,&selected,TAG_END);
  203.                 RemoveGList(Window,GadgetList,-1);
  204.                 if(GadgetList) FreeGadgets(GadgetList);
  205.                 if(VisualInfo) FreeVisualInfo(VisualInfo);
  206.                 GadgetList=0;
  207.                 VisualInfo=0;
  208.                 listview.ng_LeftEdge=10;
  209.                 listview.ng_TopEdge=10+fhoehe;
  210.                 listview.ng_Width=Window->Width-36;
  211.                 listview.ng_Height=Window->Height-20-fhoehe;
  212.                 if(!(VisualInfo=GetVisualInfo(Screen,TAG_END)))
  213.                     closethings();
  214.                 if(!(Gadget=CreateContext(&GadgetList)))
  215.                     closethings();
  216.                 /*  hier werden die Gadgets initialisiert   */
  217.                 listview.ng_VisualInfo=VisualInfo;    /*  VisualInfo und Font eintragen   */
  218.                 listview.ng_TextAttr=&ta;
  219.                 Gadget=CreateGadget(LISTVIEW_KIND,Gadget,&listview,GTLV_Labels,&list,
  220.                                     GTLV_ScrollWidth,scrollwidth,GTLV_ShowSelected,0,
  221.                                     GTLV_Selected,selected,GTLV_Top,top,TAG_END);
  222.                     if(!Gadget) closethings();
  223.                 AddGList(Window,GadgetList,100,-1,0);
  224.                 SetRast(Window->RPort,0);
  225.                 RefreshGList(GadgetList,Window,0,-1);
  226.  
  227.                 GT_RefreshWindow(Window,0);
  228.  
  229.                 RefreshWindowFrame(Window);
  230.  
  231. /*                puts("NEWSIZE");*/
  232.                 }
  233.                 break;
  234.             }
  235.             GT_ReplyIMsg(IMsg);
  236.         }
  237.         while(msg=GetMsg(myport)){
  238.             struct Node *p;int l;char *text;
  239.             text=((struct mymsg *)msg)->text;count++;
  240. /*            printf("Message received: %s\n",text);*/
  241.             l=strlen(text);
  242.             p=malloc(sizeof(struct Node));
  243.             if(!p) closethings();
  244.             p->ln_Name=malloc(l+1);
  245.             if(!p->ln_Name) closethings();
  246.             strcpy(p->ln_Name,text);
  247.             p->ln_Type=0;
  248.             p->ln_Pri=0;
  249. /*                printf("adding %s\n",p->ln_Name);*/
  250.             GT_SetGadgetAttrs(Gadget,Window,0,GTLV_Labels,~0,TAG_END);
  251.             AddTail(&list,p);
  252.             GT_SetGadgetAttrs(Gadget,Window,0,GTLV_Labels,&list,GTLV_Top,count,TAG_END);
  253.             ReplyMsg(msg);
  254.         }
  255.  
  256.     }
  257. }
  258.